# -*-coding:utf-8-*-
import pandas as pd

pd.set_option('display.unicode.east_asian_width', True)
df: pd.DataFrame = pd.read_excel(r'..\book.xlsx', sheet_name=1)

# info方法查看概况（每列非空数量、列数据类型等）
# df.info()
# 查看是否存在空值（isnull、notnull），返回True和False组成的df
df.isnull()

"""空值删除
dropna(axis=0,how="any",thresh,subset,inplace=False)
    去除含有空值的行/列，返回新的df
    -axis：0-删除有空值的行。1-删除有空值的列
    -how："any"-该行/列只要有空值就删除。"all"-该行/列全为空值才删除
    -subset：此参数指定的某些列/行中有空值时才删除
"""
df.dropna(how='all')  # 删除全为空值的行
df.dropna(subset=['单价', '分类'])  # 删除'单价，分类'列中有空值的行
df2 = df.dropna().reset_index(drop=True)  # 只要有空值就删除该行
df2['图书编号'] = df2['图书编号'].astype('int64')  # 有空值时数字类型的列会自动转为float64，删除空值后再转回来

"""空值填充
1.ffill(axis=0,inplace=False,limit,downcast)
    用前一个非缺失值进行填充（当空值在第一行/列时不会被填充），返回新的df
    -axis：0-用同一列前一个值填充。1-用同一行前一个值填充
2.bfill(axis=0,inplace=False,limit,downcast)
    用后一个非缺失值进行填充
3.fillna(value,method,axis,inplace=False,limit,downcast)
    指定值或方式进行填充，返回新的df
    -value：要填充的值，可以是单个值（全部替换成此值）、字典（按列替换值）、series或df
    -method：替换方式（不能和value参数同时存在），可以为'ffill'、'bfill'
"""
df.ffill(axis=1)  # 用同一行前一个非缺失值填充
df.bfill()  # 用同一列后一个非缺失值进行填充
df.fillna(0)  # 空值全部替换成0
df.fillna(method='ffill')
df.fillna({'单价': 0, '分类': '其它'})  # 单价列空值替换为0，分类列空值替换为’其它‘
df['书名'] = df['书名'].fillna('book')  # 直接原地修改书名列的空值

"""重复值处理
1.duplicated(subset,keep="first")
    按行判断是否存在重复值，返回bool类型的series
    -subset：查找特定列上的重复项
    -keep："first"：第一个重复值为False，"last"：最后一个重复值为False，False：所有重复值都为True
2.drop_duplicates(subset,keep="first",inplace=False,ignore_index=False)
    删除重复值
    -subset：仅考虑某些列来识别重复项，默认情况下使用所有列。
    -keep："first"：保留第一次出现的重复项。 "last"：保留最后一次出现的重复项。False：删除所有重复项。
    -ignore_index：如果为True，则重新生成索引
"""
df3: pd.DataFrame = pd.read_excel(r'..\book.xlsx', sheet_name=2)
df3.duplicated()  # 判断整行数据是否重复
df3.duplicated(['brand', 'style'], keep='last')  # 判断每行数据在特定列上是否重复，且最后一个重复值设为False
df3.drop_duplicates()  # 删除整行数据重复的项
df3.drop_duplicates(['brand', 'style'], keep='last', ignore_index=True)  # 删除每行在特定列上重复的数据，并且重建索引

